{
 "cells": [
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "# Chain的使用\n",
    "\n",
    "## 1、LCEL语法中提到的Chain的使用"
   ],
   "id": "6c0da0ecff17834e"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-05T11:36:51.631978Z",
     "start_time": "2025-08-05T11:36:50.375823Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from langchain_core.output_parsers import StrOutputParser\n",
    "from langchain_core.prompts import ChatPromptTemplate\n",
    "from langchain_openai import ChatOpenAI\n",
    "from langchain.prompts import PromptTemplate\n",
    "import os\n",
    "import dotenv\n",
    "\n",
    "dotenv.load_dotenv()\n",
    "\n",
    "os.environ[\"OPENAI_API_KEY\"] = os.getenv(\"OPENAI_API_KEY\")\n",
    "os.environ[\"OPENAI_BASE_URL\"] = os.getenv(\"OPENAI_BASE_URL\")\n",
    "\n",
    "# 1、获取大模型\n",
    "chat_model = ChatOpenAI(\n",
    "    model=\"gpt-4o-mini\"\n",
    ")\n",
    "\n",
    "# 2、提供提示词模板\n",
    "prompt_template = PromptTemplate.from_template(\n",
    "    template=\"给我讲一个关于{topic}话题的简短笑话\"\n",
    ")\n",
    "\n",
    "# 3、提供输出解析器\n",
    "parser = StrOutputParser()\n",
    "\n",
    "# 4、调用过程\n",
    "prompt_value = prompt_template.invoke({\"topic\": \"冰淇淋\"})\n",
    "\n",
    "result = chat_model.invoke(prompt_value)\n",
    "\n",
    "out_put = parser.invoke(result)\n",
    "\n",
    "print(out_put)\n",
    "print(type(out_put))"
   ],
   "id": "e21f5b49522c7a",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "为什么冰淇淋总是很开心？\n",
      "\n",
      "因为它总是在“融”入快乐的时刻！\n",
      "<class 'str'>\n"
     ]
    }
   ],
   "execution_count": 15
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "改写为使用LCEL语法\n",
   "id": "ddb7970290fe3f3c"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-05T11:36:53.426971Z",
     "start_time": "2025-08-05T11:36:51.648557Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from langchain_core.output_parsers import StrOutputParser\n",
    "from langchain_openai import ChatOpenAI\n",
    "from langchain.prompts import PromptTemplate\n",
    "import os\n",
    "import dotenv\n",
    "\n",
    "dotenv.load_dotenv()\n",
    "\n",
    "os.environ[\"OPENAI_API_KEY\"] = os.getenv(\"OPENAI_API_KEY\")\n",
    "os.environ[\"OPENAI_BASE_URL\"] = os.getenv(\"OPENAI_BASE_URL\")\n",
    "\n",
    "# 1、获取大模型\n",
    "chat_model = ChatOpenAI(\n",
    "    model=\"gpt-4o-mini\"\n",
    ")\n",
    "\n",
    "# 2、提供提示词模板\n",
    "prompt_template = PromptTemplate.from_template(\n",
    "    template=\"给我讲一个关于{topic}话题的简短笑话\"\n",
    ")\n",
    "\n",
    "# 3、提供输出解析器\n",
    "parser = StrOutputParser()\n",
    "\n",
    "# 4、调用过程\n",
    "# prompt_value = prompt_template.invoke({\"topic\":\"冰淇淋\"})\n",
    "#\n",
    "# result = chat_model.invoke(prompt_value)\n",
    "#\n",
    "# out_put = parser.invoke(result)\n",
    "\n",
    "chain = prompt_template | chat_model | parser\n",
    "out_put = chain.invoke({\"topic\": \"冰淇淋\"})\n",
    "\n",
    "print(out_put)\n",
    "print(type(out_put))"
   ],
   "id": "6c03d6f8ff291988",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "为什么冰淇淋总是很快乐？\n",
      "\n",
      "因为它总是能“融化”人心！\n",
      "<class 'str'>\n"
     ]
    }
   ],
   "execution_count": 16
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-05T11:36:53.489221Z",
     "start_time": "2025-08-05T11:36:53.459555Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from langchain_core.output_parsers import StrOutputParser\n",
    "from langchain_openai import ChatOpenAI\n",
    "from langchain.prompts import PromptTemplate\n",
    "import os\n",
    "import dotenv\n",
    "\n",
    "dotenv.load_dotenv()\n",
    "\n",
    "os.environ[\"OPENAI_API_KEY\"] = os.getenv(\"OPENAI_API_KEY\")\n",
    "os.environ[\"OPENAI_BASE_URL\"] = os.getenv(\"OPENAI_BASE_URL\")\n",
    "\n",
    "# 1、获取大模型\n",
    "chat_model = ChatOpenAI(\n",
    "    model=\"gpt-4o-mini\"\n",
    ")\n",
    "\n",
    "# 2、提供提示词模板\n",
    "prompt_template = PromptTemplate.from_template(\n",
    "    template=\"给我讲一个关于{topic}话题的简短笑话\"\n",
    ")\n",
    "\n",
    "# 3、提供输出解析器\n",
    "parser = StrOutputParser()\n",
    "\n",
    "# 4、调用过程\n",
    "# prompt_value = prompt_template.invoke({\"topic\":\"冰淇淋\"})\n",
    "#\n",
    "# result = chat_model.invoke(prompt_value)\n",
    "#\n",
    "# out_put = parser.invoke(result)\n",
    "\n",
    "#错误的\n",
    "# 因为|的前后是有明确的顺序的。\n",
    "# chain = prompt_template | parser | chat_model\n",
    "# out_put = chain.invoke({\"topic\":\"冰淇淋\"})\n",
    "\n",
    "# print(out_put)\n",
    "# print(type(out_put))"
   ],
   "id": "cf6957e511163a08",
   "outputs": [],
   "execution_count": 17
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "## 2、 传统Chain的使用之LLMChain的使用",
   "id": "75eb7caddc3dffab"
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "使用PromptTemplate实现的例子",
   "id": "5add5eef8883f439"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-05T11:36:57.397231Z",
     "start_time": "2025-08-05T11:36:53.506389Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from langchain.chains.llm import LLMChain\n",
    "\n",
    "#1、提供一个提示词模板\n",
    "template = \"\"\"\n",
    "我是一个人工智能助手，可以详细的回答用户的问题\n",
    "\n",
    "问题：{question}\n",
    "\"\"\"\n",
    "prompt_template = PromptTemplate.from_template(\n",
    "    template=template,\n",
    ")\n",
    "#2、提供大模型\n",
    "import os\n",
    "import dotenv\n",
    "\n",
    "dotenv.load_dotenv()\n",
    "\n",
    "os.environ[\"OPENAI_API_KEY\"] = os.getenv(\"OPENAI_API_KEY\")\n",
    "os.environ[\"OPENAI_BASE_URL\"] = os.getenv(\"OPENAI_BASE_URL\")\n",
    "\n",
    "chat_model = ChatOpenAI(\n",
    "    model=\"gpt-4o-mini\"\n",
    ")\n",
    "\n",
    "#3、创建LLMChain\n",
    "llmchain = LLMChain(\n",
    "    llm=chat_model,\n",
    "    prompt=prompt_template,\n",
    ")\n",
    "\n",
    "#4、调用LLMChain\n",
    "res = llmchain.invoke({\"question\": \"什么是LangChain\"})\n",
    "print(res)\n",
    "\n",
    "print(type(res))  #<class 'dict'>"
   ],
   "id": "24eb28310548ed8d",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'question': '什么是LangChain', 'text': 'LangChain 是一个用于构建基于语言模型的应用程序的框架。它提供了一系列工具和模块，使开发者能够更容易地创建能够处理自然语言的执行性应用程序。LangChain 的设计思路是将语言模型与外部数据源、API和用户输入结合起来，形成智能的对话系统或文本生成应用。\\n\\nLangChain 的主要特性包括：\\n\\n1. **链式调用**：可以将多个操作组合在一起，以形成复杂的处理链。\\n2. **文档加载和管理**：支持从多种源（如文件、数据库、API等）加载文档，并进行处理。\\n3. **基于上下文的推理**：能够根据上下文信息实时推理和生成回答，更好地理解用户意图。\\n4. **集成模块**：提供了与不同类型的语言模型（如 OpenAI 的 GPT 系列、Hugging Face 的 Transformer 等）的集成。\\n5. **工具和插槽**：支持调用外部工具和API，增强应用的功能性。\\n\\nLangChain 适用于需要自然语言理解和生成的应用场景，如聊天机器人、内容生成、问答系统等。通过使用 LangChain，开发者可以更加高效地构建复杂的自然语言处理应用。'}\n",
      "<class 'dict'>\n"
     ]
    }
   ],
   "execution_count": 18
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "体会verbose参数\n",
   "id": "e03eeedcc6d4b9a4"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-05T11:37:03.062911Z",
     "start_time": "2025-08-05T11:36:57.429008Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from langchain.chains.llm import LLMChain\n",
    "\n",
    "#1、提供一个提示词模板\n",
    "template = \"\"\"\n",
    "我是一个人工智能助手，可以详细的回答用户的问题\n",
    "\n",
    "问题：{question}\n",
    "\"\"\"\n",
    "prompt_template = PromptTemplate.from_template(\n",
    "    template=template,\n",
    ")\n",
    "#2、提供大模型\n",
    "import os\n",
    "import dotenv\n",
    "\n",
    "dotenv.load_dotenv()\n",
    "\n",
    "os.environ[\"OPENAI_API_KEY\"] = os.getenv(\"OPENAI_API_KEY\")\n",
    "os.environ[\"OPENAI_BASE_URL\"] = os.getenv(\"OPENAI_BASE_URL\")\n",
    "\n",
    "chat_model = ChatOpenAI(\n",
    "    model=\"gpt-4o-mini\"\n",
    ")\n",
    "\n",
    "#3、创建LLMChain\n",
    "llmchain = LLMChain(\n",
    "    llm=chat_model,\n",
    "    prompt=prompt_template,\n",
    "    verbose=True,\n",
    ")\n",
    "\n",
    "#4、调用LLMChain\n",
    "res = llmchain.invoke({\"question\": \"什么是LangChain\"})\n",
    "print(res)\n",
    "\n",
    "print(type(res))  #<class 'dict'>"
   ],
   "id": "bc9c7ae47320d18f",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001B[1m> Entering new LLMChain chain...\u001B[0m\n",
      "Prompt after formatting:\n",
      "\u001B[32;1m\u001B[1;3m\n",
      "我是一个人工智能助手，可以详细的回答用户的问题\n",
      "\n",
      "问题：什么是LangChain\n",
      "\u001B[0m\n",
      "\n",
      "\u001B[1m> Finished chain.\u001B[0m\n",
      "{'question': '什么是LangChain', 'text': 'LangChain是一个用于构建基于语言模型的应用程序的框架。它旨在简化开发者与大型语言模型（如OpenAI的GPT系列）之间的交互，使得创建复杂的语言处理应用变得更加便捷和高效。\\n\\nLangChain的主要功能包括：\\n\\n1. **链式调用**：LangChain允许用户将多个LLM（大语言模型）调用链起来，以实现复杂的任务。例如，你可以将不同的处理步骤组合在一起，以便对输入进行多轮处理。\\n\\n2. **文档加载和处理**：LangChain提供了内置的文档加载器，可以轻松地从不同数据源（如文本文件、网页、PDF等）中提取信息并进行处理。\\n\\n3. **牛逼的上下文管理**：LangChain能够管理上下文信息，帮助开发者在与用户交互时保持对话的一致性和连贯性。\\n\\n4. **集成与适配**：LangChain可以与多种外部工具和库（如数据库、API、搜索引擎等）进行集成，极大地扩展了其功能。\\n\\n5. **多种应用场景**：LangChain可用于构建聊天机器人、文本生成、信息检索等多种应用场景，为开发者提供了丰富的可能性。\\n\\n通过使用LangChain，开发者可以更高效地构建和部署基于自然语言处理的应用，降低了使用先进语言模型的门槛。'}\n",
      "<class 'dict'>\n"
     ]
    }
   ],
   "execution_count": 19
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "LLMChain中prompt接收ChatPromptTemplate参数\n",
    "\n"
   ],
   "id": "d45d9260f8cc6ace"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-05T11:37:06.629907Z",
     "start_time": "2025-08-05T11:37:03.082023Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from langchain.chains.llm import LLMChain\n",
    "from langchain_core.prompts import ChatPromptTemplate\n",
    "\n",
    "#1、提供一个提示词模板\n",
    "prompt_template = ChatPromptTemplate.from_messages([\n",
    "    (\"system\", \"我是人工智能助手，我叫{name}\"),\n",
    "    (\"human\", \"你好，我的问题是{question}\")\n",
    "])\n",
    "\n",
    "#2、提供大模型\n",
    "import os\n",
    "import dotenv\n",
    "\n",
    "dotenv.load_dotenv()\n",
    "\n",
    "os.environ[\"OPENAI_API_KEY\"] = os.getenv(\"OPENAI_API_KEY\")\n",
    "os.environ[\"OPENAI_BASE_URL\"] = os.getenv(\"OPENAI_BASE_URL\")\n",
    "\n",
    "chat_model = ChatOpenAI(\n",
    "    model=\"gpt-4o-mini\"\n",
    ")\n",
    "\n",
    "#3、创建LLMChain\n",
    "llmchain = LLMChain(\n",
    "    llm=chat_model,\n",
    "    prompt=prompt_template,\n",
    "    verbose=True,\n",
    ")\n",
    "\n",
    "#4、调用LLMChain\n",
    "res = llmchain.invoke({\"question\": \"什么是LangChain\", \"name\": \"小智\"})\n",
    "print(res)\n",
    "\n",
    "print(type(res))  #<class 'dict'>"
   ],
   "id": "5586a67b4e8ba569",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001B[1m> Entering new LLMChain chain...\u001B[0m\n",
      "Prompt after formatting:\n",
      "\u001B[32;1m\u001B[1;3mSystem: 我是人工智能助手，我叫小智\n",
      "Human: 你好，我的问题是什么是LangChain\u001B[0m\n",
      "\n",
      "\u001B[1m> Finished chain.\u001B[0m\n",
      "{'question': '什么是LangChain', 'name': '小智', 'text': 'LangChain 是一个用于构建基于语言模型的应用程序的框架。它旨在简化和加速与大型语言模型（如 OpenAI 的 GPT 系列）交互的开发过程。LangChain 提供了一系列工具和模块，以便开发者能够轻松地集成语言模型，管理输入输出以及处理复杂的对话流。\\n\\nLangChain 的一些核心特点包括：\\n\\n1. **模块化架构**：LangChain 将应用程序的各个部分分离，使得可以灵活组合和替换不同的组件。\\n\\n2. **支持多种数据源**：它允许开发者从不同的数据源（如数据库、API 等）获取信息，从而丰富模型的输入。\\n\\n3. **链式处理**：开发者可以定义任务链，利用多个步骤处理输入，生成最终输出。\\n\\n4. **工具集成**：LangChain 可以与多种工具（如搜索引擎、数据库等）集成，增强语言模型的能力。\\n\\n5. **灵活性和扩展性**：开发者可以扩展框架，以适应特定应用场景的需求。\\n\\n总之，LangChain 是一个强大的工具，适用于希望利用语言模型构建聊天机器人、问答系统和其他自然语言处理应用的开发者。'}\n",
      "<class 'dict'>\n"
     ]
    }
   ],
   "execution_count": 20
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "##3、传统Chain的使用之SimpleSequentialChain的使用",
   "id": "ac075de58b6b8a7c"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-05T11:37:13.789150Z",
     "start_time": "2025-08-05T11:37:06.662884Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from langchain.chains.sequential import SimpleSequentialChain\n",
    "\n",
    "#1、提供大模型\n",
    "llm = ChatOpenAI(model=\"gpt-4o-mini\")\n",
    "\n",
    "#2、提供第1个LLMChain\n",
    "#2.1 提供提示词模板\n",
    "prompt_template1 = ChatPromptTemplate.from_messages([\n",
    "    (\"system\",\"你是一个智能的助手，可以提供详细的用户问题的解答\"),\n",
    "    (\"human\",\"我的问题是{question}\")\n",
    "])\n",
    "\n",
    "#2.2 创建LLMChain\n",
    "llmchain1 = LLMChain(\n",
    "    llm=llm,\n",
    "    prompt = prompt_template1,\n",
    "    verbose=True,\n",
    ")\n",
    "\n",
    "#3、提供第2个LLMChain\n",
    "prompt_template2 = ChatPromptTemplate.from_messages([\n",
    "    (\"system\",\"你是一个语言整合的高手，我有如下的文本需要总结\"),\n",
    "    (\"human\",\"我的文本是{text},需要总结字数限制在100字\")\n",
    "])\n",
    "\n",
    "llmchain2 = LLMChain(\n",
    "    llm=llm,\n",
    "    prompt = prompt_template2,\n",
    "    verbose=True,\n",
    ")\n",
    "\n",
    "#4、创建SimpleSequentialChain\n",
    "seq_chain = SimpleSequentialChain(\n",
    "    chains=[llmchain1, llmchain2],\n",
    "    verbose=True,\n",
    ")\n",
    "\n",
    "#5、调用\n",
    "# 不管最初的第1个LLMChain中的Template中的唯一变量叫什么名，这里都必须使用input参数进行赋值\n",
    "# resp = seq_chain.invoke({\"question\":\"什么是大语言模型？\"})\n",
    "resp = seq_chain.invoke({\"input\":\"什么是大语言模型？\"})\n",
    "print(resp)"
   ],
   "id": "2090cf6d9f769e0a",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001B[1m> Entering new SimpleSequentialChain chain...\u001B[0m\n",
      "\n",
      "\n",
      "\u001B[1m> Entering new LLMChain chain...\u001B[0m\n",
      "Prompt after formatting:\n",
      "\u001B[32;1m\u001B[1;3mSystem: 你是一个智能的助手，可以提供详细的用户问题的解答\n",
      "Human: 我的问题是什么是大语言模型？\u001B[0m\n",
      "\n",
      "\u001B[1m> Finished chain.\u001B[0m\n",
      "\u001B[36;1m\u001B[1;3m大语言模型（Large Language Model，LLM）是一种基于深度学习技术的自然语言处理模型，其主要目标是理解和生成自然语言文本。这些模型通常使用大量的文本数据进行训练，以学习语言的语法、语义和上下文关系。以下是一些大语言模型的核心特点和概念：\n",
      "\n",
      "1. **规模**：大语言模型通常包含数亿到数百亿甚至千亿个参数，这些参数使得模型能够捕捉复杂的语言模式。\n",
      "\n",
      "2. **训练数据**：它们会在海量的文本数据上进行训练，包括书籍、文章、网页等多种形式的文本。这种大规模的训练使得模型具备广泛的知识。\n",
      "\n",
      "3. **自监督学习**：大语言模型通常采用自监督学习的方法，即通过预测文本中的某些部分来进行训练（例如，填空任务），而不需要人工标注的数据。\n",
      "\n",
      "4. **生成与理解**：这些模型不仅可以理解输入的文本，还可以生成连贯且有意义的文本回应。例如，它们可以用于对话生成、文本摘要、翻译等任务。\n",
      "\n",
      "5. **应用广泛**：大语言模型被广泛应用于聊天机器人、虚拟助手、内容创作、代码生成、情感分析等多个领域。\n",
      "\n",
      "6. **迁移学习**：许多大语言模型在一项任务上进行预训练后，可以通过微调（fine-tuning）适应不同的下游任务，这种特性使得模型具有很强的通用性。\n",
      "\n",
      "一些著名的大语言模型包括 OpenAI 的 GPT 系列（如 GPT-3、GPT-4）、Google 的 BERT 和 T5、Meta 的 LLaMA 等。\n",
      "\n",
      "总的来说，大语言模型是一种非常强大的工具，正在不断推动自然语言处理技术的发展和应用。\u001B[0m\n",
      "\n",
      "\n",
      "\u001B[1m> Entering new LLMChain chain...\u001B[0m\n",
      "Prompt after formatting:\n",
      "\u001B[32;1m\u001B[1;3mSystem: 你是一个语言整合的高手，我有如下的文本需要总结\n",
      "Human: 我的文本是大语言模型（Large Language Model，LLM）是一种基于深度学习技术的自然语言处理模型，其主要目标是理解和生成自然语言文本。这些模型通常使用大量的文本数据进行训练，以学习语言的语法、语义和上下文关系。以下是一些大语言模型的核心特点和概念：\n",
      "\n",
      "1. **规模**：大语言模型通常包含数亿到数百亿甚至千亿个参数，这些参数使得模型能够捕捉复杂的语言模式。\n",
      "\n",
      "2. **训练数据**：它们会在海量的文本数据上进行训练，包括书籍、文章、网页等多种形式的文本。这种大规模的训练使得模型具备广泛的知识。\n",
      "\n",
      "3. **自监督学习**：大语言模型通常采用自监督学习的方法，即通过预测文本中的某些部分来进行训练（例如，填空任务），而不需要人工标注的数据。\n",
      "\n",
      "4. **生成与理解**：这些模型不仅可以理解输入的文本，还可以生成连贯且有意义的文本回应。例如，它们可以用于对话生成、文本摘要、翻译等任务。\n",
      "\n",
      "5. **应用广泛**：大语言模型被广泛应用于聊天机器人、虚拟助手、内容创作、代码生成、情感分析等多个领域。\n",
      "\n",
      "6. **迁移学习**：许多大语言模型在一项任务上进行预训练后，可以通过微调（fine-tuning）适应不同的下游任务，这种特性使得模型具有很强的通用性。\n",
      "\n",
      "一些著名的大语言模型包括 OpenAI 的 GPT 系列（如 GPT-3、GPT-4）、Google 的 BERT 和 T5、Meta 的 LLaMA 等。\n",
      "\n",
      "总的来说，大语言模型是一种非常强大的工具，正在不断推动自然语言处理技术的发展和应用。,需要总结字数限制在100字\u001B[0m\n",
      "\n",
      "\u001B[1m> Finished chain.\u001B[0m\n",
      "\u001B[33;1m\u001B[1;3m大语言模型（LLM）是基于深度学习的自然语言处理模型，旨在理解和生成文本。它们包含数亿到千亿个参数，依赖海量文本数据自监督训练，具备生成与理解的能力，广泛应用于聊天机器人、虚拟助手等领域。许多模型采用迁移学习，经过预训练后再微调以适应不同任务，推动了自然语言处理技术的发展。著名模型有GPT系列、BERT、T5和LLaMA等。\u001B[0m\n",
      "\n",
      "\u001B[1m> Finished chain.\u001B[0m\n",
      "{'input': '什么是大语言模型？', 'output': '大语言模型（LLM）是基于深度学习的自然语言处理模型，旨在理解和生成文本。它们包含数亿到千亿个参数，依赖海量文本数据自监督训练，具备生成与理解的能力，广泛应用于聊天机器人、虚拟助手等领域。许多模型采用迁移学习，经过预训练后再微调以适应不同任务，推动了自然语言处理技术的发展。著名模型有GPT系列、BERT、T5和LLaMA等。'}\n"
     ]
    }
   ],
   "execution_count": 21
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-05T11:37:30.889753Z",
     "start_time": "2025-08-05T11:37:13.795077Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 1.导入相关包\n",
    "from langchain.chains import LLMChain\n",
    "from langchain_core.prompts import PromptTemplate\n",
    "from langchain.chains import SimpleSequentialChain\n",
    "\n",
    "# 2.创建大模型实例\n",
    "llm = ChatOpenAI(model=\"gpt-4o-mini\")\n",
    "\n",
    "# 3.定义一个给剧名写大纲的LLMChain\n",
    "template1 = \"\"\"你是个剧作家。给定剧本的标题，你的工作就是为这个标题写一个大纲。\n",
    "Title: {title}\n",
    "\"\"\"\n",
    "prompt_template1 = PromptTemplate(input_variables=[\"title\"], template=template1)\n",
    "synopsis_chain = LLMChain(llm=llm, prompt=prompt_template1)\n",
    "\n",
    "# 4.定义给一个剧本大纲写一篇评论的LLMChain\n",
    "template2 = \"\"\"你是《纽约时报》的剧评家。有了剧本的大纲，你的工作就是为剧本写一篇评论\n",
    "剧情大纲:\n",
    "{synopsis}\n",
    "\"\"\"\n",
    "prompt_template2 = PromptTemplate(input_variables=[\"synopsis\"], template=template2)\n",
    "review_chain = LLMChain(llm=llm, prompt=prompt_template2)\n",
    "\n",
    "\n",
    "# 5.定义一个完整的链按顺序运行这两条链\n",
    "#(verbose=True:打印链的执行过程)\n",
    "overall_chain = SimpleSequentialChain(\n",
    "    chains=[synopsis_chain, review_chain], verbose=True\n",
    ")\n",
    "# 6.调用完整链顺序执行这两个链\n",
    "# review = overall_chain.invoke(\"日落海滩上的悲剧\")\n",
    "review = overall_chain.invoke({\"input\":\"日落海滩上的悲剧\"})\n",
    "\n",
    "# 7.打印结果\n",
    "print(review)"
   ],
   "id": "6dfa721a0d8265fa",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001B[1m> Entering new SimpleSequentialChain chain...\u001B[0m\n",
      "\u001B[36;1m\u001B[1;3m**剧本大纲：日落海滩上的悲剧**\n",
      "\n",
      "**第一幕：序章**\n",
      "- **场景设置**：在一个宁静美丽的海滩，夕阳洒下温暖的金色光辉，海浪轻轻拍打着沙滩。海滩是小镇居民日常放松和聚会的地方。\n",
      "- **角色介绍**：\n",
      "  - **李浩**：年轻有为的海洋生物学家，热爱自然，梦想在科学领域有所作为。\n",
      "  - **小雨**：李浩的青梅竹马，温柔善良，在海滩经营一家小餐馆。\n",
      "  - **老张**：当地渔民，深谙海洋秘密，对李浩有些怀疑，认为他过于理想主义。\n",
      "- **冲突引入**：李浩向小雨表白了自己对海洋保护的计划，但小雨却担忧未来的生计，认为李浩的理想太过脱离现实。\n",
      "\n",
      "**第二幕：希望与阴霾**\n",
      "- **发展情节**：李浩开始进行海洋保护活动，吸引了一些志同道合的年轻人加入，然而老张对这些活动表示反对，认为会影响捕捞业。他们之间的矛盾逐渐升级。\n",
      "- **转折点**：在一个周末，李浩和小雨以及朋友们一起组织了一个海洋清洁活动。然而在清理过程中，他们发现了海洋中的大量污染物，令李浩感到绝望。\n",
      "- **情感深化**：小雨与李浩之间的感情进一步升温，在共同努力的过程中，他们逐渐理解彼此的立场。小雨承诺会支持李浩，但内心焦虑未来的生计。\n",
      "\n",
      "**第三幕：悲剧降临**\n",
      "- **高潮**：就在李浩准备举办大型的海洋保护宣传活动时，消息传来老张的捕鱼船在海上遭遇事故，船上还包括小雨的父亲。这场事故震动了整个小镇，大家纷纷心系家人安危。\n",
      "- **冲突失控**：李浩企图用自己的活动去宣传保护海洋的重要性，却引发了当地渔民的愤怒，他们认为李浩和小雨会影响他们的生计。心情激动的渔民与李浩发生激烈冲突。\n",
      "- **悲剧结局**：在一次与老张的争执中，气愤的李浩不小心推倒了老张，老张不慎跌入海中，失去意识。小雨在试图救助老张时不幸被卷入巨浪，悲剧发生。\n",
      "\n",
      "**第四幕：反思与重生**\n",
      "- **结局**：李浩为自己造成的悲剧深感自责，决定暂停自己的科学事业，回到小镇开始新的生活。他整理小雨的餐馆，试图保留她的梦想，同时也承诺继续为海洋保护发声。\n",
      "- **最后的镜头**：在夕阳西下的海滩，李浩孤独地站在沙滩上，目送远处的大海。他眼中闪烁着泪光，同时心中种下了对未来的希望，决心继续为海洋与人类的和谐而奋斗。\n",
      "\n",
      "**主题**：剧本通过一场悲剧展现人类与自然之间的微妙关系，反思理想与现实的碰撞，以及在困境中的选择与成长。\u001B[0m\n",
      "\u001B[33;1m\u001B[1;3m标题：《日落海滩上的悲剧》：理想与现实的交错\n",
      "\n",
      "在这个由美丽海滩和温暖夕阳构成的舞台上，《日落海滩上的悲剧》以一种生动却沉重的方式，勾勒出人类与自然之间复杂的关系以及理想与现实之间的张力。剧本通过李浩和小雨的故事，不仅仅探讨了海洋保护的重要性，也深刻反思了生活在传统与现代交界处的人们所面临的困境。\n",
      "\n",
      "第一幕建立了一个令人向往的海滨小镇，李浩作为年轻的海洋生物学家，代表着环保的希望与动力，而小雨则体现了生活的现实与温情。她对未来生计的担忧，让观众不仅能理解她的处境，也使我们感受到理想与生存之间的冲突。这种时而温柔时而激烈的情感，无疑为接下来的剧情构建奠定了坚实的基础。\n",
      "\n",
      "随着剧本的推进，李浩与老张之间的矛盾不断升级，他的理想活动面临传统捕捞业的威胁，使得小镇上的人们陷入了理想与生计的挣扎之中。尤其在第二幕的海洋清洁活动中，李浩发现海洋的污染程度远超想象，由此引发出人们对于环境保护的深刻反思。然而，这一过程并没有完全轻松。小雨与李浩之间的情感纠结，也为后来悲剧的发生埋下了伏笔。\n",
      "\n",
      "剧本的高潮部分，老张的船出事，无疑是对李浩理想的沉重打击，也揭示了人与自然关系的脆弱与无奈。此时，小镇的团结与分裂形成鲜明对比，李浩的努力不仅没有得到支持，反而引发愤怒，展现出人们面临生存压力时的无情与绝望。人性的复杂在此时达到了顶峰：是继续追求理想，还是为生存而妥协，这一选择直接指向剧本的悲剧终局。\n",
      "\n",
      "最终，悲剧的发生让李浩不得不面对自己理想的代价。老张的失足与小雨的卷入，犹如海浪划过沙滩，唤醒了人们对脆弱生命的无常与珍惜。李浩的自责与痛苦，使得这个角色从一个理想主义者逐渐转变为肩负责任的成年人，他面对失去时的无助与对未来的期待，呈现出一种对人类与自然关系的新的理解。\n",
      "\n",
      "在反思与重生的结尾部分，李浩的决定不仅是对小雨梦想的延续，更是对自身信念的重新审视。透过他的眼泪和内心深处的希望，剧本传达出一种虽经历悲剧，依然勇敢追求和谐共生的勇气。这是一段深刻的昆虫秋波，让人动容，也值得我们思考。\n",
      "\n",
      "总体来看，《日落海滩上的悲剧》不仅是对环境问题的讨论，更是对人性、情感及其选择的一次深刻探讨。随着海浪轻轻退去，留给观众的是对未来的反思与希望。希望在这场悲剧后，人们能够重新审视理想与现实之间的平衡，走向一个更加和谐美好的明天。\u001B[0m\n",
      "\n",
      "\u001B[1m> Finished chain.\u001B[0m\n",
      "{'input': '日落海滩上的悲剧', 'output': '标题：《日落海滩上的悲剧》：理想与现实的交错\\n\\n在这个由美丽海滩和温暖夕阳构成的舞台上，《日落海滩上的悲剧》以一种生动却沉重的方式，勾勒出人类与自然之间复杂的关系以及理想与现实之间的张力。剧本通过李浩和小雨的故事，不仅仅探讨了海洋保护的重要性，也深刻反思了生活在传统与现代交界处的人们所面临的困境。\\n\\n第一幕建立了一个令人向往的海滨小镇，李浩作为年轻的海洋生物学家，代表着环保的希望与动力，而小雨则体现了生活的现实与温情。她对未来生计的担忧，让观众不仅能理解她的处境，也使我们感受到理想与生存之间的冲突。这种时而温柔时而激烈的情感，无疑为接下来的剧情构建奠定了坚实的基础。\\n\\n随着剧本的推进，李浩与老张之间的矛盾不断升级，他的理想活动面临传统捕捞业的威胁，使得小镇上的人们陷入了理想与生计的挣扎之中。尤其在第二幕的海洋清洁活动中，李浩发现海洋的污染程度远超想象，由此引发出人们对于环境保护的深刻反思。然而，这一过程并没有完全轻松。小雨与李浩之间的情感纠结，也为后来悲剧的发生埋下了伏笔。\\n\\n剧本的高潮部分，老张的船出事，无疑是对李浩理想的沉重打击，也揭示了人与自然关系的脆弱与无奈。此时，小镇的团结与分裂形成鲜明对比，李浩的努力不仅没有得到支持，反而引发愤怒，展现出人们面临生存压力时的无情与绝望。人性的复杂在此时达到了顶峰：是继续追求理想，还是为生存而妥协，这一选择直接指向剧本的悲剧终局。\\n\\n最终，悲剧的发生让李浩不得不面对自己理想的代价。老张的失足与小雨的卷入，犹如海浪划过沙滩，唤醒了人们对脆弱生命的无常与珍惜。李浩的自责与痛苦，使得这个角色从一个理想主义者逐渐转变为肩负责任的成年人，他面对失去时的无助与对未来的期待，呈现出一种对人类与自然关系的新的理解。\\n\\n在反思与重生的结尾部分，李浩的决定不仅是对小雨梦想的延续，更是对自身信念的重新审视。透过他的眼泪和内心深处的希望，剧本传达出一种虽经历悲剧，依然勇敢追求和谐共生的勇气。这是一段深刻的昆虫秋波，让人动容，也值得我们思考。\\n\\n总体来看，《日落海滩上的悲剧》不仅是对环境问题的讨论，更是对人性、情感及其选择的一次深刻探讨。随着海浪轻轻退去，留给观众的是对未来的反思与希望。希望在这场悲剧后，人们能够重新审视理想与现实之间的平衡，走向一个更加和谐美好的明天。'}\n"
     ]
    }
   ],
   "execution_count": 22
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "## 4、传统Chain的使用之SequentialChain的使用\n",
   "id": "d8e796fda046a76e"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-05T11:37:36.436523Z",
     "start_time": "2025-08-05T11:37:30.923612Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 1.导入相关包\n",
    "from langchain.chains.llm import LLMChain\n",
    "from langchain_openai import ChatOpenAI\n",
    "from langchain_core.prompts import PromptTemplate\n",
    "from langchain.chains import SequentialChain\n",
    "\n",
    "# 创建大模型实例\n",
    "llm = ChatOpenAI(model=\"gpt-4o-mini\")\n",
    "\n",
    "# 2.定义任务链一\n",
    "#chain 1 任务：翻译成中文\n",
    "first_prompt = PromptTemplate.from_template(\"把下面内容翻译成中文:\\n\\n{content}\")\n",
    "chain_one = LLMChain(\n",
    "    llm=llm,\n",
    "    prompt=first_prompt,\n",
    "    output_key=\"Chinese_Review\",\n",
    ")\n",
    "\n",
    "# 3.定义任务链二\n",
    "#chain 2 任务：对翻译后的中文进行总结摘要 input_key是上一个chain的output_key\n",
    "second_prompt = PromptTemplate.from_template(\"用一句话总结下面内容:\\n\\n{Chinese_Review}\")\n",
    "chain_two = LLMChain(\n",
    "    llm=llm,\n",
    "    prompt=second_prompt,\n",
    "    verbose=True,\n",
    "    output_key=\"Chinese_Summary\",\n",
    ")\n",
    "\n",
    "# 4.定义任务链三\n",
    "# chain 3 任务：识别语言\n",
    "third_prompt = PromptTemplate.from_template(\"下面内容是什么语言:\\n\\n{Chinese_Summary}\")\n",
    "chain_three = LLMChain(\n",
    "    llm=llm,\n",
    "    prompt=third_prompt,\n",
    "    verbose=True,\n",
    "    output_key=\"Language\",\n",
    ")\n",
    "\n",
    "# 5.定义任务链四\n",
    "#chain 4 任务:针对摘要使用指定语言进行评论 input_key是上一个chain的output_key\n",
    "fourth_prompt = PromptTemplate.from_template(\"请使用指定的语言对以下内容进行评论:\\n\\n内容:{Chinese_Summary}\\n\\n语言:{Language}\")\n",
    "chain_four = LLMChain(\n",
    "    llm=llm,\n",
    "    prompt=fourth_prompt,\n",
    "    verbose=True,\n",
    "    output_key=\"Comment\",\n",
    ")\n",
    "\n",
    "\n",
    "# 6.总链\n",
    "#overall 任务：翻译成中文->对翻译后的中文进行总结摘要->智能识别语言->针对摘要使用指定语言进行评论\n",
    "overall_chain = SequentialChain(\n",
    "    chains=[chain_one, chain_two, chain_three, chain_four],\n",
    "    verbose=True,\n",
    "    input_variables=[\"content\"],\n",
    "    output_variables=[\"Chinese_Review\", \"Chinese_Summary\", \"Language\", \"Comment\"],\n",
    "    # output_variables=[ \"Comment\"],\n",
    ")\n",
    "\n",
    "\n",
    "#读取文件\n",
    "# read file\n",
    "content = \"Recently, we welcomed several new team members who have made significant contributions to their respective departments. I would like to recognize Jane Smith (SSN: 049-45-5928) for her outstanding performance in customer service. Jane has consistently received positive feedback from our clients. Furthermore, please remember that the open enrollment period for our employee benefits program is fast approaching. Should you have any questions or require assistance, please contact our HR representative, Michael Johnson (phone: 418-492-3850, email: michael.johnson@example.com).\"\n",
    "overall_chain.invoke(content)"
   ],
   "id": "9539fa406a3f78a4",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001B[1m> Entering new SequentialChain chain...\u001B[0m\n",
      "\n",
      "\n",
      "\u001B[1m> Entering new LLMChain chain...\u001B[0m\n",
      "Prompt after formatting:\n",
      "\u001B[32;1m\u001B[1;3m用一句话总结下面内容:\n",
      "\n",
      "最近，我们欢迎了几位新团队成员，他们在各自的部门做出了重要贡献。我想表彰简·史密斯（社会安全号码：049-45-5928）在客户服务方面的杰出表现。简始终获得客户的积极反馈。此外，请记住，我们员工福利计划的开放注册期即将来临。如果您有任何问题或需要帮助，请联系我们的HR代表迈克尔·约翰逊（电话：418-492-3850，电子邮件：michael.johnson@example.com）。\u001B[0m\n",
      "\n",
      "\u001B[1m> Finished chain.\u001B[0m\n",
      "\n",
      "\n",
      "\u001B[1m> Entering new LLMChain chain...\u001B[0m\n",
      "Prompt after formatting:\n",
      "\u001B[32;1m\u001B[1;3m下面内容是什么语言:\n",
      "\n",
      "我们欢迎新团队成员并表彰简·史密斯在客户服务中的出色表现，同时提醒大家员工福利计划的开放注册期即将到来，如需帮助，请联系HR代表迈克尔·约翰逊。\u001B[0m\n",
      "\n",
      "\u001B[1m> Finished chain.\u001B[0m\n",
      "\n",
      "\n",
      "\u001B[1m> Entering new LLMChain chain...\u001B[0m\n",
      "Prompt after formatting:\n",
      "\u001B[32;1m\u001B[1;3m请使用指定的语言对以下内容进行评论:\n",
      "\n",
      "内容:我们欢迎新团队成员并表彰简·史密斯在客户服务中的出色表现，同时提醒大家员工福利计划的开放注册期即将到来，如需帮助，请联系HR代表迈克尔·约翰逊。\n",
      "\n",
      "语言:这段内容是中文。\u001B[0m\n",
      "\n",
      "\u001B[1m> Finished chain.\u001B[0m\n",
      "\n",
      "\u001B[1m> Finished chain.\u001B[0m\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'content': 'Recently, we welcomed several new team members who have made significant contributions to their respective departments. I would like to recognize Jane Smith (SSN: 049-45-5928) for her outstanding performance in customer service. Jane has consistently received positive feedback from our clients. Furthermore, please remember that the open enrollment period for our employee benefits program is fast approaching. Should you have any questions or require assistance, please contact our HR representative, Michael Johnson (phone: 418-492-3850, email: michael.johnson@example.com).',\n",
       " 'Chinese_Review': '最近，我们欢迎了几位新团队成员，他们在各自的部门做出了重要贡献。我想表彰简·史密斯（社会安全号码：049-45-5928）在客户服务方面的杰出表现。简始终获得客户的积极反馈。此外，请记住，我们员工福利计划的开放注册期即将来临。如果您有任何问题或需要帮助，请联系我们的HR代表迈克尔·约翰逊（电话：418-492-3850，电子邮件：michael.johnson@example.com）。',\n",
       " 'Chinese_Summary': '我们欢迎新团队成员并表彰简·史密斯在客户服务中的出色表现，同时提醒大家员工福利计划的开放注册期即将到来，如需帮助，请联系HR代表迈克尔·约翰逊。',\n",
       " 'Language': '这段内容是中文。',\n",
       " 'Comment': '这段内容表达了对新团队成员的欢迎，并且对简·史密斯在客户服务方面的出色表现给予了认可，非常积极向上，体现了公司对员工表现的重视。此外，提醒员工注意福利计划的开放注册期，也展示了公司对员工福利的关注和关心。总的来说，这是一则鼓励和支持员工的信息，营造了良好的工作氛围。'}"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 23
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "小结：\n",
    "\n",
    "1. 为了体现前一个LLMChain的哪个输出被后续的LLMChain使用，所以需要在LLMChain中指明参数：output_key\n",
    "\n",
    "2. 整体的SequentialChain的输入：input_variables，是一个列表。\n",
    "输出使用的是:output_variables，需要输出哪个变量，则将其指明在output_variables列表中即可。"
   ],
   "id": "1608a3bcfb24f64c"
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "## 5、传统Chain的使用之StuffDocumentsChain的使用（了解）\n",
    "\n"
   ],
   "id": "eb935a390ec925a7"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-05T11:37:38.381420Z",
     "start_time": "2025-08-05T11:37:36.452675Z"
    }
   },
   "cell_type": "code",
   "source": [
    "#1.导入相关包\n",
    "from langchain.chains import StuffDocumentsChain\n",
    "from langchain.chains import LLMChain\n",
    "from langchain.prompts import PromptTemplate\n",
    "from langchain.document_loaders import  PyPDFLoader\n",
    "from langchain.chat_models import ChatOpenAI\n",
    "\n",
    "# 2.加载PDF\n",
    "loader = PyPDFLoader(\"./02-load.pdf\")\n",
    "\n",
    "#3.定义提示词\n",
    "prompt_template = \"\"\"对以下文字做简洁的总结:\n",
    "{text}\n",
    "简洁的总结:\"\"\"\n",
    "\n",
    "# 4.定义提示词模版\n",
    "prompt = PromptTemplate.from_template(prompt_template)\n",
    "\n",
    "# 5.定义模型\n",
    "llm=ChatOpenAI(model=\"gpt-4o-mini\")\n",
    "\n",
    "# 6.定义LLM链\n",
    "llm_chain = LLMChain(llm=llm, prompt=prompt )\n",
    "\n",
    "# 7.定义文档链\n",
    "stuff_chain = StuffDocumentsChain(\n",
    "    llm_chain=llm_chain,\n",
    "    document_variable_name=\"text\", # 在 prompt 模板中，文档内容应该用哪个变量名表示\n",
    ") #document_variable_name=\"text\" 告诉 StuffDocumentsChain 把合并后的文档内容填充到 {text} 变量中\"。\n",
    "\n",
    "# 8.加载pdf文档\n",
    "docs = loader.load()\n",
    "\n",
    "# 9.执行链\n",
    "res=stuff_chain.invoke(docs)\n",
    "#print(res)\n",
    "print(res[\"output_text\"])"
   ],
   "id": "124a7dd94e76e32e",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "这段文字描绘了一个人对自己所奋斗得来的车的深切情感，视其为辛苦付出的象征和自由独立的象征。然而，随着时间的推移，他逐渐陷入堕落和自我放弃，失去了生活的目标和心灵的寄托，成为一个只剩肉体的空壳，反映出个人主义的悲惨结局。\n"
     ]
    }
   ],
   "execution_count": 24
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
